/**
 * 一个单词最多用两次
 * 单词可以不全用完
 * 不可以包含：一旦包含了和不用岂不是一样
 * 按照贪心原则，重叠部分应该越少越好
 */
#include<bits/stdc++.h>
using namespace std;
const int maxn = 24;
string s[maxn];
int vis[maxn];
int n;
int ans;
bool startsWith(string& a, string & b) { // B starts with A
  if(a.size() > b.size()) return false;
  for(int i=0; i<a.size(); ++i) {
    if(a[i] != b[i]) return false;
  }
  return true;
}
int link(string a, string b) {
  if(startsWith(a, b)) return 0;
  char ch = b[0];
  int len = 0;
  bool match = false;
  for(int i=a.size()-1; i>=0; --i) {
    if(ch==a[i]) {
      int j=0, k=i;
      for(; j<b.size() && k<a.size(); ++j, ++k) {
        if(a[k]!=b[j]) break;
      }
      if(k==a.size()) {
        match=true;
        len = j;
      }
    }
    if(match) {
      if(len==b.size()) return 0;
      return len;
    }
  }
  return 0;
}

string cat(string a, string b, int k) {
  a.append(b.begin()+k, b.end());
  return a;
}

int dfs(string now) {
  int ans = 0;
  for(int i=0; i<n; ++i) {
    int overlap = link(now, s[i]);
    if(vis[i]==2 || overlap==0) continue;
    vis[i] ++;
    string newstr = cat(now, s[i], overlap);
    ans = max({dfs(newstr), (int)newstr.size(), ans});
    vis[i] --;
  }
  return ans;
}
int main() {
  cin>>n; for(int i=0; i<n; ++i) cin>>s[i];
  string start; cin>>start;
  cout << dfs('$'+start) -1 << '\n';
}
